/**
 * 计算控件组件
 * 提供计算表单的标准操作按钮，包括计算、重置及自定义导出功能
 * 遵循Ant Design Button和Space组件的使用规范
 * 
 * 该组件封装了计算表单中常用的操作按钮，包括：
 * 1. 计算按钮 - 触发表单计算逻辑
 * 2. 重置按钮 - 重置表单到初始状态
 * 3. 导出组件 - 可选的导出功能（如下拉菜单）
 * 4. 次要操作 - 可选的额外操作按钮
 * 
 * 组件特性：
 * - 支持按钮禁用状态控制
 * - 支持自定义按钮文本
 * - 支持自定义导出组件
 * - 统一的样式和测试标识
 */
import React from 'react';
import { Button, Space } from 'antd';

/**
 * 计算控件属性接口
 * 定义了计算控件组件所需的所有属性
 */
interface CalcControlsProps {
  /** 计算按钮点击回调函数 */
  onCalculate?: () => void;
  /** 重置按钮点击回调函数 */
  onReset?: () => void;
  /** 导出组件，通常是下拉菜单或按钮 */
  exportComponent?: React.ReactNode;
  /** 计算按钮文本，默认为'计算' */
  calculateText?: string;
  /** 重置按钮文本，默认为'重置' */
  resetText?: string;
  /** 重置按钮后的次要节点（如额外操作按钮） */
  secondary?: React.ReactNode;
  /** 是否禁用所有按钮 */
  disabled?: boolean;
}

/**
 * 计算控件组件实现
 * 
 * 提供计算表单的标准操作按钮集合，包括计算、重置和导出功能
 * 所有按钮都支持禁用状态，便于在计算过程中控制用户交互
 * 
 * @param props 组件属性
 * @param props.onCalculate 计算按钮点击回调函数
 * @param props.onReset 重置按钮点击回调函数
 * @param props.exportComponent 导出组件（可选）
 * @param props.calculateText 计算按钮文本（默认为"计算"）
 * @param props.resetText 重置按钮文本（默认为"重置"）
 * @param props.secondary 次要操作节点（可选）
 * @param props.disabled 是否禁用所有按钮（默认为false）
 * @returns React组件
 */
const CalcControls: React.FC<CalcControlsProps> = ({
  onCalculate,
  onReset,
  exportComponent,
  calculateText = '计算',
  resetText = '重置',
  secondary,
  disabled = false,
}) => {
  // 处理计算按钮点击事件，确保回调函数存在
  const handleCalculate = (e: React.MouseEvent<HTMLElement>) => {
    if (onCalculate) {
      onCalculate();
    }
  };

  // 处理重置按钮点击事件，确保回调函数存在
  const handleReset = (e: React.MouseEvent<HTMLElement>) => {
    if (onReset) {
      onReset();
    }
  };

  return (
    <Space align="baseline">
      <Button 
        type="primary" 
        htmlType="submit" 
        onClick={handleCalculate} 
        disabled={disabled}
        className="calc-primary-button"
        data-testid="calc-primary-button"
      >
        {calculateText}
      </Button>

      <Button 
        onClick={handleReset} 
        disabled={disabled}
        className="calc-reset-button"
        data-testid="calc-reset-button"
      >
        {resetText}
      </Button>

      {exportComponent && (
        <span className="calc-export-component">
          {exportComponent}
        </span>
      )}

      {secondary}
    </Space>
  );
};

export default CalcControls;